Load data

Got tables from appkernel.ccr.buffalo.edu modw database.

# cleanup
dbDisconnect(con)
Error in dbDisconnect(con) : object 'con' not found
# renaming things to make it more straightforward...?
all_res <- all_res1
Error: object 'all_res1' not found
# doesn't apply for me
# this section appears to determine what sort of node/cpu it ran on? So not exactly similar for me
edge_CPU_L5520 <-c(
sprintf("cpn-d14-%02d", seq(2,23)),
sprintf("cpn-d14-%02d", seq(26,39)),
sprintf("cpn-d15-%02d", c(seq(1,32),seq(34,40))),
sprintf("cpn-d16-%02d", c(seq(2,14),seq(17,41))),
"cpn-d15-33",
"cpn-d16-15",
"cpn-d16-16"
)

nodes_CPU_L5520 <- rep(FALSE,times=nrow(all_res))
for(i in 1:nrow(all_res)){
    #i<-1
    m_nodes<-strsplit(trimws(gsub(";"," ",all_res$nodes[[i]]))," ")[[1]]
    rigth_cpu <- TRUE
    for(m_node in m_nodes){
        #print(paste(m_node,m_node %in% edge_CPU_L5520))
        if(!(m_node %in% edge_CPU_L5520)){
            rigth_cpu=FALSE
        }
    }
    #print(paste(i,rigth_cpu))
    nodes_CPU_L5520[i]<-rigth_cpu
}
all_res$resource[nodes_CPU_L5520] <- "edge8core_ibm"
all_res$resource[all_res$resource=="edge"] <- "edge8core_dell"

all <- all_res %>% filter(app!="test") %>%
    select(state,task_id,resource,app,nnodes,walltime,collected,body)
# replacing on a conditional
all_res$cpu_type[grepl("cpn-u25-39",all_res$nodes)] <- "CPU-GOLD-6130"
Warning message:
In UseMethod("as.list") :
  call dbDisconnect() when finished working with a connection
# parses the body for all of the various metrics/info
metrics <- all %>% group_by(state,resource,app,nnodes,task_id) %>% do(get_metrics(.$body) )
Warning in .Internal(unique(x, incomparables, fromLast, nmax)) :
  call dbDisconnect() when finished working with a connection

|======================                                                                                                                                              | 14% ~13 s remaining    
|======================                                                                                                                                              | 14% ~13 s remaining    
|=======================                                                                                                                                             | 14% ~13 s remaining    
|========================                                                                                                                                            | 15% ~13 s remaining    
|========================                                                                                                                                            | 15% ~13 s remaining    
|=========================                                                                                                                                           | 16% ~13 s remaining    
|==========================                                                                                                                                          | 16% ~12 s remaining    
|===========================                                                                                                                                         | 16% ~12 s remaining    
|===========================                                                                                                                                         | 17% ~13 s remaining    
|============================                                                                                                                                        | 17% ~13 s remaining    
|============================                                                                                                                                        | 17% ~13 s remaining    
|=============================                                                                                                                                       | 18% ~13 s remaining    
|=============================                                                                                                                                       | 18% ~13 s remaining    
|==============================                                                                                                                                      | 18% ~13 s remaining    
|==============================                                                                                                                                      | 19% ~13 s remaining    
|===============================                                                                                                                                     | 19% ~13 s remaining    
|===============================                                                                                                                                     | 19% ~13 s remaining    
|================================                                                                                                                                    | 20% ~13 s remaining    
|================================                                                                                                                                    | 20% ~13 s remaining    
|=================================                                                                                                                                   | 20% ~13 s remaining    
|=================================                                                                                                                                   | 21% ~14 s remaining    
|==================================                                                                                                                                  | 21% ~14 s remaining    
|==================================                                                                                                                                  | 21% ~14 s remaining    
|===================================                                                                                                                                 | 22% ~14 s remaining    
|===================================                                                                                                                                 | 22% ~14 s remaining    
|====================================                                                                                                                                | 22% ~14 s remaining    
|====================================                                                                                                                                | 23% ~14 s remaining    
|=====================================                                                                                                                               | 23% ~14 s remaining    
|======================================                                                                                                                              | 23% ~14 s remaining    
|======================================                                                                                                                              | 24% ~14 s remaining    
|=======================================                                                                                                                             | 24% ~14 s remaining    
|=======================================                                                                                                                             | 24% ~14 s remaining    
|========================================                                                                                                                            | 24% ~14 s remaining    
|========================================                                                                                                                            | 25% ~14 s remaining    
|=========================================                                                                                                                           | 25% ~14 s remaining    
|=========================================                                                                                                                           | 25% ~14 s remaining    
|==========================================                                                                                                                          | 26% ~14 s remaining    
|==========================================                                                                                                                          | 26% ~14 s remaining    
|===========================================                                                                                                                         | 26% ~14 s remaining    
|===========================================                                                                                                                         | 27% ~14 s remaining    
|============================================                                                                                                                        | 27% ~14 s remaining    
|============================================                                                                                                                        | 27% ~14 s remaining    
|=============================================                                                                                                                       | 28% ~14 s remaining    
|=============================================                                                                                                                       | 28% ~14 s remaining    
|==============================================                                                                                                                      | 28% ~14 s remaining    
|==============================================                                                                                                                      | 28% ~14 s remaining    
|===============================================                                                                                                                     | 29% ~14 s remaining    
|===============================================                                                                                                                     | 29% ~14 s remaining    
|================================================                                                                                                                    | 29% ~14 s remaining    
|================================================                                                                                                                    | 30% ~14 s remaining    
|=================================================                                                                                                                   | 30% ~14 s remaining    
|=================================================                                                                                                                   | 30% ~14 s remaining    
|==================================================                                                                                                                  | 31% ~14 s remaining    
|==================================================                                                                                                                  | 31% ~14 s remaining    
|===================================================                                                                                                                 | 31% ~14 s remaining    
|===================================================                                                                                                                 | 32% ~14 s remaining    
|====================================================                                                                                                                | 32% ~14 s remaining    
|=====================================================                                                                                                               | 32% ~14 s remaining    
|=====================================================                                                                                                               | 33% ~14 s remaining    
|======================================================                                                                                                              | 33% ~14 s remaining    
|======================================================                                                                                                              | 33% ~14 s remaining    
|=======================================================                                                                                                             | 34% ~14 s remaining    
|=======================================================                                                                                                             | 34% ~13 s remaining    
|========================================================                                                                                                            | 34% ~13 s remaining    
|========================================================                                                                                                            | 35% ~13 s remaining    
|=========================================================                                                                                                           | 35% ~13 s remaining    
|=========================================================                                                                                                           | 35% ~13 s remaining    
|==========================================================                                                                                                          | 36% ~13 s remaining    
|==========================================================                                                                                                          | 36% ~13 s remaining    
|===========================================================                                                                                                         | 36% ~13 s remaining    
|===========================================================                                                                                                         | 36% ~13 s remaining    
|============================================================                                                                                                        | 37% ~13 s remaining    
|============================================================                                                                                                        | 37% ~13 s remaining    
|=============================================================                                                                                                       | 37% ~13 s remaining    
|=============================================================                                                                                                       | 38% ~13 s remaining    
|==============================================================                                                                                                      | 38% ~13 s remaining    
|==============================================================                                                                                                      | 38% ~13 s remaining    
|===============================================================                                                                                                     | 39% ~13 s remaining    
|===============================================================                                                                                                     | 39% ~13 s remaining    
|================================================================                                                                                                    | 39% ~13 s remaining    
|================================================================                                                                                                    | 40% ~13 s remaining    
|=================================================================                                                                                                   | 40% ~13 s remaining    
|=================================================================                                                                                                   | 40% ~13 s remaining    
|==================================================================                                                                                                  | 40% ~13 s remaining    
|==================================================================                                                                                                  | 41% ~13 s remaining    
|===================================================================                                                                                                 | 41% ~13 s remaining    
|===================================================================                                                                                                 | 41% ~13 s remaining    
|====================================================================                                                                                                | 42% ~12 s remaining    
|=====================================================================                                                                                               | 42% ~12 s remaining    
|=====================================================================                                                                                               | 42% ~12 s remaining    
|======================================================================                                                                                              | 43% ~12 s remaining    
|======================================================================                                                                                              | 43% ~12 s remaining    
|=======================================================================                                                                                             | 43% ~12 s remaining    
|=======================================================================                                                                                             | 44% ~12 s remaining    
|========================================================================                                                                                            | 44% ~12 s remaining    
|========================================================================                                                                                            | 44% ~12 s remaining    
|=========================================================================                                                                                           | 45% ~12 s remaining    
|=========================================================================                                                                                           | 45% ~12 s remaining    
|==========================================================================                                                                                          | 45% ~12 s remaining    
|==========================================================================                                                                                          | 46% ~12 s remaining    
|===========================================================================                                                                                         | 46% ~12 s remaining    
|===========================================================================                                                                                         | 46% ~12 s remaining    
|============================================================================                                                                                        | 47% ~12 s remaining    
|============================================================================                                                                                        | 47% ~12 s remaining    
|=============================================================================                                                                                       | 47% ~11 s remaining    
|=============================================================================                                                                                       | 48% ~11 s remaining    
|==============================================================================                                                                                      | 48% ~11 s remaining    
|==============================================================================                                                                                      | 48% ~11 s remaining    
|===============================================================================                                                                                     | 48% ~11 s remaining    
|================================================================================                                                                                    | 49% ~11 s remaining    
|================================================================================                                                                                    | 49% ~11 s remaining    
|=================================================================================                                                                                   | 49% ~11 s remaining    
|=================================================================================                                                                                   | 50% ~11 s remaining    
|==================================================================================                                                                                  | 50% ~11 s remaining    
|==================================================================================                                                                                  | 50% ~11 s remaining    
|===================================================================================                                                                                 | 51% ~11 s remaining    
|====================================================================================                                                                                | 51% ~11 s remaining    
|=====================================================================================                                                                               | 52% ~10 s remaining    
|=====================================================================================                                                                               | 52% ~10 s remaining    
|======================================================================================                                                                              | 53% ~10 s remaining    
|=======================================================================================                                                                             | 53% ~10 s remaining    
|=======================================================================================                                                                             | 54% ~10 s remaining    
|========================================================================================                                                                            | 54% ~10 s remaining    
|=========================================================================================                                                                           | 54% ~10 s remaining    
|==========================================================================================                                                                          | 55% ~10 s remaining    
|==========================================================================================                                                                          | 55% ~9 s remaining     
|===========================================================================================                                                                         | 56% ~9 s remaining     
|============================================================================================                                                                        | 56% ~9 s remaining     
|============================================================================================                                                                        | 57% ~9 s remaining     
|=============================================================================================                                                                       | 57% ~9 s remaining     
|==============================================================================================                                                                      | 57% ~9 s remaining     
|==============================================================================================                                                                      | 58% ~9 s remaining     
|===============================================================================================                                                                     | 58% ~9 s remaining     
|================================================================================================                                                                    | 59% ~9 s remaining     
|=================================================================================================                                                                   | 59% ~8 s remaining     
|==================================================================================================                                                                  | 60% ~8 s remaining     
|==================================================================================================                                                                  | 60% ~8 s remaining     
|===================================================================================================                                                                 | 61% ~8 s remaining     
|====================================================================================================                                                                | 61% ~8 s remaining     
|====================================================================================================                                                                | 61% ~8 s remaining     
|=====================================================================================================                                                               | 62% ~8 s remaining     
|======================================================================================================                                                              | 62% ~8 s remaining     
|=======================================================================================================                                                             | 63% ~8 s remaining     
|=======================================================================================================                                                             | 63% ~7 s remaining     
|========================================================================================================                                                            | 64% ~7 s remaining     
|=========================================================================================================                                                           | 64% ~7 s remaining     
|==========================================================================================================                                                          | 65% ~7 s remaining     
|===========================================================================================================                                                         | 65% ~7 s remaining     
|===========================================================================================================                                                         | 66% ~7 s remaining     
|============================================================================================================                                                        | 66% ~7 s remaining     
|=============================================================================================================                                                       | 67% ~7 s remaining     
|=============================================================================================================                                                       | 67% ~7 s remaining     
|==============================================================================================================                                                      | 67% ~7 s remaining     
|==============================================================================================================                                                      | 68% ~7 s remaining     
|===============================================================================================================                                                     | 68% ~7 s remaining     
|===============================================================================================================                                                     | 68% ~6 s remaining     
|================================================================================================================                                                    | 68% ~6 s remaining     
|================================================================================================================                                                    | 69% ~6 s remaining     
|=================================================================================================================                                                   | 69% ~6 s remaining     
|=================================================================================================================                                                   | 69% ~6 s remaining     
|==================================================================================================================                                                  | 70% ~6 s remaining     
|==================================================================================================================                                                  | 70% ~6 s remaining     
|===================================================================================================================                                                 | 70% ~6 s remaining     
|===================================================================================================================                                                 | 71% ~6 s remaining     
|====================================================================================================================                                                | 71% ~6 s remaining     
|=====================================================================================================================                                               | 71% ~6 s remaining     
|=====================================================================================================================                                               | 72% ~6 s remaining     
|======================================================================================================================                                              | 72% ~6 s remaining     
|======================================================================================================================                                              | 72% ~6 s remaining     
|=======================================================================================================================                                             | 73% ~6 s remaining     
|=======================================================================================================================                                             | 73% ~6 s remaining     
|========================================================================================================================                                            | 73% ~6 s remaining     
|========================================================================================================================                                            | 74% ~5 s remaining     
|=========================================================================================================================                                           | 74% ~5 s remaining     
|=========================================================================================================================                                           | 74% ~5 s remaining     
|==========================================================================================================================                                          | 74% ~5 s remaining     
|==========================================================================================================================                                          | 75% ~5 s remaining     
|===========================================================================================================================                                         | 75% ~5 s remaining     
|===========================================================================================================================                                         | 75% ~5 s remaining     
|============================================================================================================================                                        | 76% ~5 s remaining     
|============================================================================================================================                                        | 76% ~5 s remaining     
|=============================================================================================================================                                       | 76% ~5 s remaining     
|=============================================================================================================================                                       | 77% ~5 s remaining     
|==============================================================================================================================                                      | 77% ~5 s remaining     
|==============================================================================================================================                                      | 77% ~5 s remaining     
|===============================================================================================================================                                     | 78% ~5 s remaining     
|===============================================================================================================================                                     | 78% ~5 s remaining     
|================================================================================================================================                                    | 78% ~5 s remaining     
|================================================================================================================================                                    | 78% ~5 s remaining     
|=================================================================================================================================                                   | 79% ~4 s remaining     
|=================================================================================================================================                                   | 79% ~4 s remaining     
|==================================================================================================================================                                  | 79% ~4 s remaining     
|==================================================================================================================================                                  | 80% ~4 s remaining     
|===================================================================================================================================                                 | 80% ~4 s remaining     
|===================================================================================================================================                                 | 80% ~4 s remaining     
|====================================================================================================================================                                | 81% ~4 s remaining     
|====================================================================================================================================                                | 81% ~4 s remaining     
|=====================================================================================================================================                               | 81% ~4 s remaining     
|=====================================================================================================================================                               | 82% ~4 s remaining     
|======================================================================================================================================                              | 82% ~4 s remaining     
|======================================================================================================================================                              | 82% ~4 s remaining     
|=======================================================================================================================================                             | 83% ~4 s remaining     
|=======================================================================================================================================                             | 83% ~4 s remaining     
|========================================================================================================================================                            | 83% ~4 s remaining     
|========================================================================================================================================                            | 83% ~4 s remaining     
|=========================================================================================================================================                           | 84% ~3 s remaining     
|=========================================================================================================================================                           | 84% ~3 s remaining     
|==========================================================================================================================================                          | 84% ~3 s remaining     
|==========================================================================================================================================                          | 85% ~3 s remaining     
|===========================================================================================================================================                         | 85% ~3 s remaining     
|===========================================================================================================================================                         | 85% ~3 s remaining     
|============================================================================================================================================                        | 86% ~3 s remaining     
|============================================================================================================================================                        | 86% ~3 s remaining     
|=============================================================================================================================================                       | 86% ~3 s remaining     
|=============================================================================================================================================                       | 87% ~3 s remaining     
|==============================================================================================================================================                      | 87% ~3 s remaining     
|===============================================================================================================================================                     | 87% ~3 s remaining     
|===============================================================================================================================================                     | 88% ~3 s remaining     
|================================================================================================================================================                    | 88% ~3 s remaining     
|================================================================================================================================================                    | 88% ~3 s remaining     
|=================================================================================================================================================                   | 88% ~2 s remaining     
|=================================================================================================================================================                   | 89% ~2 s remaining     
|=================================================================================================================================================                   | 89% ~2 s remaining     
|==================================================================================================================================================                  | 89% ~2 s remaining     
|==================================================================================================================================================                  | 90% ~2 s remaining     
|===================================================================================================================================================                 | 90% ~2 s remaining     
|===================================================================================================================================================                 | 90% ~2 s remaining     
|====================================================================================================================================================                | 91% ~2 s remaining     
|=====================================================================================================================================================               | 91% ~2 s remaining     
|=====================================================================================================================================================               | 91% ~2 s remaining     
|=====================================================================================================================================================               | 91% ~2 s remaining     
|======================================================================================================================================================              | 92% ~2 s remaining     
|======================================================================================================================================================              | 92% ~2 s remaining     
|=======================================================================================================================================================             | 92% ~2 s remaining     
|=======================================================================================================================================================             | 93% ~2 s remaining     
|========================================================================================================================================================            | 93% ~2 s remaining     
|========================================================================================================================================================            | 93% ~1 s remaining     
|=========================================================================================================================================================           | 94% ~1 s remaining     
|==========================================================================================================================================================          | 94% ~1 s remaining     
|==========================================================================================================================================================          | 94% ~1 s remaining     
|===========================================================================================================================================================         | 95% ~1 s remaining     
|===========================================================================================================================================================         | 95% ~1 s remaining     
|============================================================================================================================================================        | 95% ~1 s remaining     
|============================================================================================================================================================        | 96% ~1 s remaining     
|=============================================================================================================================================================       | 96% ~1 s remaining     
|=============================================================================================================================================================       | 96% ~1 s remaining     
|==============================================================================================================================================================      | 96% ~1 s remaining     
|==============================================================================================================================================================      | 97% ~1 s remaining     
|===============================================================================================================================================================     | 97% ~1 s remaining     
|===============================================================================================================================================================     | 97% ~1 s remaining     
|================================================================================================================================================================    | 98% ~1 s remaining     
|================================================================================================================================================================    | 98% ~0 s remaining     
|=================================================================================================================================================================   | 98% ~0 s remaining     
|=================================================================================================================================================================   | 98% ~0 s remaining     
|=================================================================================================================================================================   | 99% ~0 s remaining     
|==================================================================================================================================================================  | 99% ~0 s remaining     
|==================================================================================================================================================================  | 99% ~0 s remaining     
|=================================================================================================================================================================== |100% ~0 s remaining     
|====================================================================================================================================================================|100% ~0 s remaining     
# gets only the entries that are hpcc
all_hpcc <- all[all$app == "HPCC",]
all_hpcc$task_id <- as.numeric(all_hpcc$task_id)
metrics_hpcc <- metrics[metrics$app == "HPCC",]

# keeps the units of metrics intact
metrics_hpcc$metric_and_units <- paste(metrics_hpcc$metric, "(", metrics_hpcc$units,")", sep="")
remove(temp)

# makes a data frame with 21 columns, 25 rows (however many metrics there are)
temp <- data.frame(matrix(ncol=length(unique(metrics_hpcc$metric_and_units)), nrow=length(unique(metrics_hpcc$task_id))))

# sets up the name of the columns (based on the metrics gotten)
column_names = c("task_id", unique(metrics_hpcc$metric_and_units))
colnames(temp) <- column_names
Error in names(x) <- value : 
  'names' attribute [21] must be the same length as the vector [20]
full_gamess <- setup_data("GAMESS")
full_gamess <- setup_data("GAMESS")
full_hpcg <- setup_data("HPCG") 
full_hpcc <- setup_data("HPCC")
full_hpcg <- setup_data("HPCG") 
full_hpcc <- setup_data("HPCC")
full_ior <- setup_data("IOR")
Error in `$<-.data.frame`(`*tmp*`, "metric_and_units", value = "()") : 
  replacement has 1 row, data has 0

t.test(hpcc_singularity$`Fast Fourier Transform (FFTW) Floating-Point Performance(MFLOP per Second)`, hpcc_bare_metal$`Fast Fourier Transform (FFTW) Floating-Point Performance(MFLOP per Second)`)

    Welch Two Sample t-test

data:  hpcc_singularity$`Fast Fourier Transform (FFTW) Floating-Point Performance(MFLOP per Second)` and hpcc_bare_metal$`Fast Fourier Transform (FFTW) Floating-Point Performance(MFLOP per Second)`
t = -3.6828, df = 207.04, p-value = 0.0002944
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -510.4233 -154.4815
sample estimates:
mean of x mean of y 
 19772.84  20105.30 
ggplot(full_hpcc, aes(x = resource, y = walltime, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='centerwhole')
colnames(full_hpcc) <- gsub(" ","_",colnames(full_hpcc))
ggplot(full_hpcc, aes(x = resource, y = `MPI Random Access(MUpdate per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center', binwidth=0.1)
ggplot(full_hpcc, aes(x = resource, y = `Average Double-Precision General Matrix Multiplication (DGEMM) Floating-Point Performance(MFLOP per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
ggplot(full_hpcc, aes(x = resource, y = `Average STREAM 'Add' Memory Bandwidth(MByte per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
ggplot(full_hpcc, aes(x = resource, y = `Average STREAM 'Copy' Memory Bandwidth(MByte per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
ggplot(full_hpcc, aes(x = resource, y = `Fast Fourier Transform (FFTW) Floating-Point Performance(MFLOP per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
ggplot(full_hpcc, aes(x = resource, y = `High Performance LINPACK Efficiency(Percent)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
ggplot(full_hpcc, aes(x = resource, y = `Parallel Matrix Transpose (PTRANS)(MByte per Second)`, fill=cpu_type)) +
    geom_dotplot(binaxis='y', stackdir='center')
# making sure to filter out any resources we aint using
metrics %<>% filter(resource %in% c("vortex_bare_metal","vortex_dock_sing"))

metrics$resource <- factor(
    metrics$resource,
    levels = unique(c("vortex_bare_metal","vortex_dock_sing")))

levels(metrics$resource) <- c("TestCluster","ProductionCluster")
metrics$nnodes <- factor(metrics$nnodes,levels = unique(c(1,2,4,8,16,metrics$nnodes)))

metrics$state_id <- metrics$state
metrics$state <- as.character(metrics$state_id)
metrics$state[metrics$state=="1"]<-"Before"
metrics$state[metrics$state=="2"]<-"After"

metrics$state <- factor(metrics$state,levels = c("Before","After"))

metrics %<>% arrange(collected)

#convert md performance should be ns/day was sim second per Day
j <- metrics$metric=="Molecular Dynamics Performance"
metrics$value[j] <- metrics$value[j]*1e9
metrics$units[j] <- "ns/day"
write.csv(metrics,"metrics.csv")
save(
    list=c("metrics"),
    file="metrics.Rdata"
)


metrics %<>% filter(app %in% c("HPCC","NAMD"))
metrics$app <- factor(as.character(metrics$app),levels = c("HPCC","NAMD"))

selected_metrics <- c(
    "Wall Clock Time",
    "Molecular Dynamics Simulation Performance",
    "High Performance LINPACK Floating-Point Performance",
    "Fast Fourier Transform (FFTW) Floating-Point Performance",
    "Average Double-Precision General Matrix Multiplication (DGEMM) Floating-Point Performance",
    "Average STREAM 'Copy' Memory Bandwidth"
)
metrics %<>% filter(metric %in% selected_metrics)
metrics$metric <- factor(as.character(metrics$metric),levels = selected_metrics)
metrics$metric_long <- metrics$metric
levels(metrics$metric) <- c(
    "Wall Time",
    "MD Perf.",
    "LINPACK",
    "FFT",
    "DGEMM",
    "STREAM"
)

#convert md performance should be ns/day was sim second per Day
j <- metrics$metric=="Molecular Dynamics Performance"
metrics$value[j] <- metrics$value[j]*1e9

j <- metrics$metric=="LINPACK"
metrics$value[j] <- metrics$value[j]/1024

#metrics %>% group_by(metric) %>% summarise(units=last(units))
metrics$units <- metrics$metric
levels(metrics$units) <- c(
    "s",
    "ns/day",
    "GFLOP/s",
    "MFLOP/s",
    "MFLOP/s",
    "MB/s"
)

save(
    list=c("metrics"),
    file="metrics_selected.Rdata"
)
load(file="metrics_selected.Rdata")
#select only what is needed2

#only up to 30 points for Testing-Cluster
metrics %>% group_by(resource, app, nnodes, metric, state) %>% 
    mutate(id = row_number()) %>% 
    summarise(n=n(),avg=mean(value),units=last(units))
    
metrics %<>% group_by(resource, app, nnodes, metric, state) %>% 
        mutate(id = row_number()) %>% ungroup()


metrics %<>% filter(!(resource=="Testing-Cluster" & id > 30L))

#Sparcify After for UBHPC
metrics %>% filter(resource=="UB-HPC" & app == "NAMD") %>% group_by(resource, app, nnodes, metric, state) %>% 
    mutate(id = row_number()) %>% 
    summarise(n=n(),avg=mean(value),units=last(units))

metrics_ubhpc <- metrics %>% filter(resource=="UB-HPC" & state=="After" & metric == "Wall Time" & app == "NAMD" & nnodes == 1L & id > 10)
set.seed(08122018)
remover_task_id <- metrics_ubhpc$task_id[!(metrics_ubhpc$task_id %in% sample(metrics_ubhpc$task_id,size = 20L))]
metrics %<>% filter(!(task_id %in% remover_task_id))

metrics_ubhpc <- metrics %>% filter(resource=="UB-HPC" & state=="After" & metric == "Wall Time" & app == "NAMD" & nnodes == 2L & id > 20)
remover_task_id <- metrics_ubhpc$task_id[!(metrics_ubhpc$task_id %in% sample(metrics_ubhpc$task_id,size = 10L))]
metrics %<>% filter(!(task_id %in% remover_task_id))


metrics_ubhpc <- metrics %>% filter(resource=="UB-HPC" & state=="After" & metric == "Wall Time" & app == "HPCC" & nnodes == 1L & id > 10)
set.seed(08122018)
remover_task_id <- metrics_ubhpc$task_id[!(metrics_ubhpc$task_id %in% sample(metrics_ubhpc$task_id,size = 20L))]
metrics %<>% filter(!(task_id %in% remover_task_id))

metrics_ubhpc <- metrics %>% filter(resource=="UB-HPC" & state=="After" & metric == "Wall Time" & app == "HPCC" & nnodes == 2L & id > 10)
remover_task_id <- metrics_ubhpc$task_id[!(metrics_ubhpc$task_id %in% sample(metrics_ubhpc$task_id,size = 20L))]
metrics %<>% filter(!(task_id %in% remover_task_id))


metrics %>% filter(resource=="UB-HPC") %>% group_by(resource, app, nnodes, metric, state) %>% 
    mutate(id = row_number()) %>% 
    summarise(n=n(),avg=mean(value),units=last(units))

save(
    list=c("metrics"),
    file="metrics_selected2.Rdata"
)
#Read metrics bigger smaller

ak_metrics <- read.csv("ak_metrics.csv",header = F,col.names = c("app","metric","better"))

m_app<-ak_metrics$app[[1]]
for(i in 2:nrow(ak_metrics)){
    if(ak_metrics$app[[i]]==""){
        ak_metrics$app[[i]]=m_app
    }else{
        m_app<-ak_metrics$app[[i]]
    }
}
ak_metrics$BiggerBetter <- ak_metrics$better !="S"

ak_metrics %<>% filter(metric!="" & app %in% unlist(app_conv,use.names = F))  %>% select(-better)

save(
    list=c("ak_metrics"),
    file="ak_metrics.Rdata"
)
LS0tCnRpdGxlOiAiTWVsdGRvd24gU3BlY3RyZSBVcGRhdGUgUGVyZm9ybWFuY2UgSW5mbHVlbmNlIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKbGlicmFyeShYTUwpCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpsaWJyYXJ5KFJNYXJpYURCKQojaW5zdGFsbC5wYWNrYWdlcygiZ3JpZEV4dHJhIikKbGlicmFyeShncmlkRXh0cmEpCmBgYAoKCiMgTG9hZCBkYXRhCgpHb3QgdGFibGVzIGZyb20gYXBwa2VybmVsLmNjci5idWZmYWxvLmVkdSBtb2R3IGRhdGFiYXNlLgpgYGB7cn0KI2NvbiA8LSBkYkNvbm5lY3QoUk1hcmlhREI6Ok1hcmlhREIoKSwgZ3JvdXAgPSAiYXBwa2VybmVsIiwgZGJuYW1lID0gIm1vZF9ha3JyIikKCiMganVzdCBjb25uZWN0aW5nIHdpdGggcm9vdCBiYyBpdHMgdGhlIGVhc2llc3QKY29uIDwtIGRiQ29ubmVjdChSTWFyaWFEQjo6TWFyaWFEQigpLCB1c2VybmFtZT0icm9vdCIsZ3JvdXAgPSAiYXBwa2VybmVsIiwgZGJuYW1lID0gIm1vZF9ha3JyIikKCiNnZXQgYWxsIHRhYmxlcyBleGNlcHQgam9iZmFjdApyZXMgPC0gZGJTZW5kUXVlcnkoCiAgICBjb24sIAogICAgIlNFTEVDVCAqIEZST00gbW9kX2FrcnIuYWtycl94ZG1vZF9pbnN0YW5jZWluZm8gCiAgICBXSEVSRSBzdGF0dXM9MSBBTkQgY29sbGVjdGVkID4gJzIwMTctMTEtMDggMDA6MDA6MDAnIEFORCAKICAgICAgICAoKHJlc291cmNlIExJS0UgXCJodWV5JVwiIEFORCBjb2xsZWN0ZWQgPCAnMjAxOC0wMS0wNSAxMzowMDowMCcpIE9SCiAgICAgICAgKHJlc291cmNlIExJS0UgXCJlZGdlJVwiIEFORCBjb2xsZWN0ZWQgPCAnMjAxOC0wMS0wOCAwMDowMDowMCcpKTsiKQoKIyB1cGRhdGVkIGZvciBtZSwgdGhpcyBhcHBlYXJzIHRvIGdldCBzb21lIHRhYmxlcyB0aGF0IGhhdmUgYWxsIHRoZSBpbmZvCnJlcyA8LSBkYlNlbmRRdWVyeShjb24sICJTRUxFQ1QgKiBGUk9NIG1vZF9ha3JyLmFrcnJfeGRtb2RfaW5zdGFuY2VpbmZvIHdoZXJlIHN0YXR1cz0xIEFORCAoKHJlc291cmNlIExJS0UgXCJiYXJlX21ldGFsX3JlYWwlXCIpIE9SIChyZXNvdXJjZSBMSUtFIFwic2luZ3VsYXJpdHlfcmVhbCVcIikpOyIpCgoKYWxsX3JlczE8LSBkYkZldGNoKHJlcykKZGJDbGVhclJlc3VsdChyZXMpCmFsbF9yZXMxJHN0YXRlIDwtIDFMCgojIHRoaXMgc3R1ZmYgaXMgbGlrZSB0aGUgMm5kIGhhbGYgb2YgcmVzdWx0cywgcmlnaHQgbm93IEkganVzdCBoYXZlIGl0IGFsbCBncm91cGVkIGFzIG9uZSBpbiBhbGxfcmVzMQpyZXMgPC0gZGJTZW5kUXVlcnkoY29uLCAgCiAgICAiU0VMRUNUICogRlJPTSBtb2RfYWtyci5ha3JyX3hkbW9kX2luc3RhbmNlaW5mbyAKICAgIFdIRVJFIHN0YXR1cz0xIEFORCBjb2xsZWN0ZWQgPiAnMjAxNy0wOS0wMSAwMDowMDowMCcgQU5ECiAgICAgICAgKChyZXNvdXJjZSBMSUtFIFwiaHVleSVcIiBBTkQgY29sbGVjdGVkID4gJzIwMTgtMDEtMDUgMTM6MDA6MDAnKSBPUgogICAgICAgIChyZXNvdXJjZSBMSUtFIFwiZWRnZSVcIiBBTkQgY29sbGVjdGVkID4gJzIwMTgtMDEtMDkgMDA6MDA6MDAnKSk7IikKYWxsX3JlczIgPC0gZGJGZXRjaChyZXMpCmRiQ2xlYXJSZXN1bHQocmVzKQphbGxfcmVzMiRzdGF0ZSA8LSAyTAoKYWxsX3JlcyAgPC0gcmJpbmQoYWxsX3JlczEsYWxsX3JlczIpCgojIHNvIEkganVzdCBoYXZlIGV2ZXJ5dGhpbmcgaW4gYWxsX3JlcyBub3csIHdpdGggbm8gc3RhdGUgZGlmZmVyZW5jZSBvciB3aGF0ZXZlciAKYWxsX3JlcyA8LSBhbGxfcmVzMQoKIyBjbGVhbnVwCmRiRGlzY29ubmVjdChjb24pCnJlbW92ZShjb24scmVzKQpyZW1vdmUoYWxsX3JlczEsYWxsX3JlczIpCmBgYAoKCmBgYHtyfQoKIyByZW5hbWluZyB0aGluZ3MgdG8gbWFrZSBpdCBtb3JlIHN0cmFpZ2h0Zm9yd2FyZC4uLj8KYWxsX3JlcyA8LSBhbGxfcmVzMQphbGxfcmVzICU8PiUgcmVuYW1lKGFwcF9sb25nPXJlcG9ydGVyLHRhc2tfaWQ9aW5zdGFuY2VfaWQpCmFsbF9yZXMkbm5vZGVzIDwtIGFzLmludGVnZXIoc3ViKCIuK1xcLihbMC05XSspJCIsIlxcMSIsYWxsX3JlcyRyZXBvcnRlcm5pY2tuYW1lKSkKCnMgPC0gYWxsX3JlcyRhcHAgPT0gIiIKCiMgc28gdGhpcyBsaXN0IGlzbid0IHJlYWxseSBoZWxwZnVsIHNpbmNlIGFsbCB0aGUgYXBwX2xvbmdzIGFyZSBqdXN0IGxpa2UgdGhlIGxhc3QgcGFydCBvZiB0aGVzZSB0aGluZ3MKIyBzbyBJJ20gY2hhbmdpbmcgaXQgdG8ganVzdCBoYXZlIHRoZSBsb3dlcmNhc2Ugb25lcyB3aXRob3V0IGFsbCB0aGUgeGRtb2Qgc3R1ZmZzIGluIGZyb250CmFwcF9jb252PC1saXN0KAogICAgIm5hbWQiID0gIk5BTUQiLAogICAgIm53Y2hlbSIgPSAiTldDaGVtIiwKICAgICJnYW1lc3MiID0gIkdBTUVTUyIsCiAgICAiZW56byIgPSAiRU5aTyIsCiAgICAiaHBjYyIgPSAiSFBDQyIsCiAgICAiaW1iIiA9ICJJTUIiLAogICAgImdyYXBoNTAwIiA9IkdyYXBoNTAwIiwKICAgICJpb3IiID0gIklPUiIsCiAgICAibWR0ZXN0IiA9ICJNRFRlc3QiLAogICAgImhwY2ciID0gIkhQQ0ciICMgYWxzbyBhZGRlZCBocGNnIGluCikKCiMgdGhpcyBqdXN0IHNlZW1zIHRvIGJlIGZpbHRlcmluZyBvdXQgYWxsIHRoZSB0aGluZ3MgdGhhdCBhcmVuJ3QgbGlzdGVkIGFib3ZlCmFsbF9yZXMgJTw+JSBmaWx0ZXIoYXBwX2xvbmcgJWluJSBuYW1lcyhhcHBfY29udikpCgojIGFkZHMgYW4gZXh0cmEgY29sdW1uIHNvIHRoYXQgZm9yIG5hbWQgaXQgaXMgTkFNRCBhbmQgc28gb24sIGxpa2UgdGhlIGFwcF9jb252IHVwIHRoZXJlCiMgc28gaW4gYXBwIGNvbHVtbiBpdCBoYXMgYWxsIHRob3NlIF5eIHRoaW5ncyAodGhlIGNhcHMgaW4gYXBwX2NvbnYpCmFsbF9yZXMkYXBwPC1zYXBwbHkoYWxsX3JlcyRhcHBfbG9uZyxmdW5jdGlvbih4KXt1bmxpc3QoYXBwX2NvbnZbW3hdXSl9KQoKIyB0aGlzIGp1c3Qgc2VlbXMgdG8gYmUgZm9yIGxvY2FsIHJ1bnMuLi4gZG9lc24ndCBhcHBseSB0byBtZSB5ZXQKczwtYWxsX3JlcyRhcHA9PSJJT1IiJmFsbF9yZXMkcmVzb3VyY2U9PSJodWV5X2xvY2FsIgphbGxfcmVzJGFwcFtzXTwtIklPUi5sb2NhbCIKczwtYWxsX3JlcyRhcHA9PSJNRFRlc3QiJmFsbF9yZXMkcmVzb3VyY2U9PSJodWV5X2xvY2FsIgphbGxfcmVzJGFwcFtzXTwtIk1EVGVzdC5sb2NhbCIKCiMgTi9BIGZvciBtZQphbGxfcmVzJHJlc291cmNlW2FsbF9yZXMkcmVzb3VyY2U9PSJodWV5X2xvY2FsIl09Imh1ZXkiCgojYWxsX3JlcyRzdGF0ZSA8LSBzYW1wbGUoYygxTCwyTCksbnJvdyhhbGxfcmVzKSxyZXBsYWNlID0gVFJVRSkKIyBnZXR0aW5nIHJpZCBvZiBzb21lIHNwZWNpZmljIHRhc2tzPyBOL0EgSSBiZWxpZXZlCmFsbF9yZXMgJTw+JSBmaWx0ZXIodGFza19pZCAhPSAzNzAxMzkwTCkgJT4lCiAgICBmaWx0ZXIodGFza19pZCAhPSAzNzAxMzk5TCkgJT4lCiAgICBmaWx0ZXIodGFza19pZCAhPSAzNzAxNDAwKQoKcm0ocykKYGBgCgpgYGB7cn0KIyBkb2Vzbid0IGFwcGx5IGZvciBtZQojIHRoaXMgc2VjdGlvbiBhcHBlYXJzIHRvIGRldGVybWluZSB3aGF0IHNvcnQgb2Ygbm9kZS9jcHUgaXQgcmFuIG9uPyBTbyBub3QgZXhhY3RseSBzaW1pbGFyIGZvciBtZQplZGdlX0NQVV9MNTUyMCA8LWMoCnNwcmludGYoImNwbi1kMTQtJTAyZCIsIHNlcSgyLDIzKSksCnNwcmludGYoImNwbi1kMTQtJTAyZCIsIHNlcSgyNiwzOSkpLApzcHJpbnRmKCJjcG4tZDE1LSUwMmQiLCBjKHNlcSgxLDMyKSxzZXEoMzQsNDApKSksCnNwcmludGYoImNwbi1kMTYtJTAyZCIsIGMoc2VxKDIsMTQpLHNlcSgxNyw0MSkpKSwKImNwbi1kMTUtMzMiLAoiY3BuLWQxNi0xNSIsCiJjcG4tZDE2LTE2IgopCgpub2Rlc19DUFVfTDU1MjAgPC0gcmVwKEZBTFNFLHRpbWVzPW5yb3coYWxsX3JlcykpCmZvcihpIGluIDE6bnJvdyhhbGxfcmVzKSl7CiAgICAjaTwtMQogICAgbV9ub2Rlczwtc3Ryc3BsaXQodHJpbXdzKGdzdWIoIjsiLCIgIixhbGxfcmVzJG5vZGVzW1tpXV0pKSwiICIpW1sxXV0KICAgIHJpZ3RoX2NwdSA8LSBUUlVFCiAgICBmb3IobV9ub2RlIGluIG1fbm9kZXMpewogICAgICAgICNwcmludChwYXN0ZShtX25vZGUsbV9ub2RlICVpbiUgZWRnZV9DUFVfTDU1MjApKQogICAgICAgIGlmKCEobV9ub2RlICVpbiUgZWRnZV9DUFVfTDU1MjApKXsKICAgICAgICAgICAgcmlndGhfY3B1PUZBTFNFCiAgICAgICAgfQogICAgfQogICAgI3ByaW50KHBhc3RlKGkscmlndGhfY3B1KSkKICAgIG5vZGVzX0NQVV9MNTUyMFtpXTwtcmlndGhfY3B1Cn0KYWxsX3JlcyRyZXNvdXJjZVtub2Rlc19DUFVfTDU1MjBdIDwtICJlZGdlOGNvcmVfaWJtIgphbGxfcmVzJHJlc291cmNlW2FsbF9yZXMkcmVzb3VyY2U9PSJlZGdlIl0gPC0gImVkZ2U4Y29yZV9kZWxsIgoKYWxsIDwtIGFsbF9yZXMgJT4lIGZpbHRlcihhcHAhPSJ0ZXN0IikgJT4lCiAgICBzZWxlY3Qoc3RhdGUsdGFza19pZCxyZXNvdXJjZSxhcHAsbm5vZGVzLHdhbGx0aW1lLGNvbGxlY3RlZCxib2R5KQpgYGAKCmBgYHtyfQojIEluc3RlYWQsIEknbGwgZG8gaXQgaGVyZS4gd2lsbCBhZGQgYSBuZXcgY3B1X3R5cGUgY2F0ZWdvcnkKYWxsX3JlcyRjcHVfdHlwZSA8LSAiIgoKIyByZXBsYWNpbmcgb24gYSBjb25kaXRpb25hbAphbGxfcmVzJGNwdV90eXBlIDwtICJDUFUtTDU1MjAiICMgaWYgaXRzIG5vdCB0aGUgb3RoZXIgY3B1cywgaXRzIHRoaXMgb25lCmFsbF9yZXMkY3B1X3R5cGVbZ3JlcGwoImNwbi11MjUtMzkiLGFsbF9yZXMkbm9kZXMpXSA8LSAiQ1BVLUdPTEQtNjEzMCIKYWxsX3JlcyRjcHVfdHlwZVtncmVwbCgiY3BuLXUyMi0zOSIsYWxsX3JlcyRub2RlcyldIDwtICJDUFUtR09MRC02MTMwIgojIHdpdGggMjctMzEgaXQgaGFzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGdyZXMsIGlkayBpZiB0aGF0IG1ha2VzIGEgZGlmZmVyZW5jZQphbGxfcmVzJGNwdV90eXBlW2dyZXBsKCJjcG4tdTI3LTMxIixhbGxfcmVzJG5vZGVzKV0gPC0gIkNQVS1HT0xELTYxMzAiCgphbGxfcmVzJGNwdV90eXBlW2dyZXBsKCJjcG4tdTI2IixhbGxfcmVzJG5vZGVzKV0gPC0gIkNQVS1QaGktNzI1MCIKCiMgY3B1cyBhcmUgYmFzZWQgb2ZmIG9mIHNsdXJtIGNvbmZpZyBhdCAvZXRjL3NsdXJtL3NsdXJtLWNsdXN0ZXIuY29uZgojIEkgd2FzIHVzaW5nIHRoZSBwcmVwcm9kIHBhcnRpdGlvbiBzbyB0aGF0J3Mgd2hhdCBpdHMgYmFzZWQgb24KCiMgZ2V0cyBhIHN1YnNldCBvZiB0aGUgZGF0YQphbGwgPC0gYWxsX3JlcyAlPiUgCiAgICBzZWxlY3Qoc3RhdGUsIHRhc2tfaWQsIHJlc291cmNlLCBhcHAsIG5ub2Rlcywgd2FsbHRpbWUsIGNvbGxlY3RlZCwgYm9keSwgY3B1X3R5cGUpCmBgYAoKCmBgYHtyfQojIHRoaXMgc2VlbXMgdG8gc29ydGEgcGFyc2UgdGhlIHhtbCBib2R5IGZpbGUKZ2V0X21ldHJpY3MgPC0gZnVuY3Rpb24oeG1sKXsKICAgbDwteG1sVG9MaXN0KHhtbCkgCiAgIGlmKCEoImJlbmNobWFyayIgJWluJSBuYW1lcyhsKSkpe3JldHVybihOVUxMKX0KICAgaWYoISgic3RhdGlzdGljcyIgJWluJSBuYW1lcyhsJGJlbmNobWFyaykpKXtyZXR1cm4oTlVMTCl9CiAgIAogICBsbCA8LSBsJGJlbmNobWFyayRzdGF0aXN0aWNzCiAgIGlmKGxlbmd0aChsbCk9PTApe3JldHVybihOVUxMKX0KICAgCiAgIGRmPC1OVUxMCiAgIGZvcihpIGluIDE6bGVuZ3RoKGxsKSl7CiAgICAgICBtX21ldHJpY3M8LU5BCiAgICAgICBtX3ZhbHVlPC1OQQogICAgICAgbV91bml0czwtTkEKICAgICAgIGlmKCJJRCIgJWluJSBuYW1lcyhsbFtbaV1dKSl7bV9tZXRyaWNzPC1sbFtbaV1dJElEfQogICAgICAgaWYoInZhbHVlIiAlaW4lIG5hbWVzKGxsW1tpXV0pKXttX3ZhbHVlPC1sbFtbaV1dJHZhbHVlfQogICAgICAgaWYoInVuaXRzIiAlaW4lIG5hbWVzKGxsW1tpXV0pKXttX3VuaXRzPC1sbFtbaV1dJHVuaXRzfQogICAgICAgZGYgPC0gcmJpbmQoZGYsZGF0YS5mcmFtZShtZXRyaWM9bV9tZXRyaWNzLHZhbHVlPW1fdmFsdWUsdW5pdHM9bV91bml0cyxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpKQogICB9CiAgIGRmCn0KCiMgcGFyc2VzIHRoZSBib2R5IGZvciBhbGwgb2YgdGhlIHZhcmlvdXMgbWV0cmljcy9pbmZvCm1ldHJpY3MgPC0gYWxsICU+JSBncm91cF9ieShzdGF0ZSxyZXNvdXJjZSxhcHAsbm5vZGVzLHRhc2tfaWQpICU+JSBkbyhnZXRfbWV0cmljcyguJGJvZHkpICkKbWV0cmljcyR2YWx1ZSA8LSBhcy5udW1lcmljKG1ldHJpY3MkdmFsdWUpCm1ldHJpY3MgPC0gdW5ncm91cChtZXRyaWNzKQoKCiMgdW5zdXJlIGV4YWN0bHkgd2hhdCB0aGVzZSB0aGluZ3MgZG8uLi4uIG5vdCBkb2luZyB0aGVtCm1ldHJpY3MkcmVzb3VyY2UgPC0gZmFjdG9yKG1ldHJpY3MkcmVzb3VyY2UsbGV2ZWxzPXVuaXF1ZShtZXRyaWNzJHJlc291cmNlKSkKbWV0cmljcyRhcHAgPC0gZmFjdG9yKG1ldHJpY3MkYXBwLGxldmVscz11bmxpc3QoYXBwX2NvbnYsIHVzZS5uYW1lcyA9IEZBTFNFKSkKbWV0cmljcyR1bml0cyA8LSBmYWN0b3IobWV0cmljcyR1bml0cykKbWV0cmljcyRtZXRyaWMgPC0gZmFjdG9yKG1ldHJpY3MkbWV0cmljLGxldmVscz11bmlxdWUoYygiV2FsbCBDbG9jayBUaW1lIixtZXRyaWNzJG1ldHJpYykpKQoKbWV0cmljcyAlPD4lIGxlZnRfam9pbihhbGwgJT4lIHNlbGVjdCh0YXNrX2lkLGNvbGxlY3RlZCksIGJ5PSJ0YXNrX2lkIikKZ2MoKSAjIGdhcmJhZ2UgY29sbGVjdGluZwoKIyBzbyBhdCB0aGlzIHBvaW50IEkgdGhpbmsgSSBoYXZlIGVub3VnaCB0byBkbyBhdCBsZWFzdCBhIGJpdCBvZiBzdGF0IGFuYWx5c2lzLCBzbyBJJ20gZ29ubmEgZG8gdGhhdCBpbnN0ZWFkIG9mIHRyeWluZyB0byBmaWd1cmUgYWxsIHRoZSByZXN0IG9mIHRoaXMgb3V0CmBgYAoKYGBge3J9CiMgZ2V0cyBvbmx5IHRoZSBlbnRyaWVzIHRoYXQgYXJlIGhwY2MKYWxsX2hwY2MgPC0gYWxsW2FsbCRhcHAgPT0gIkhQQ0MiLF0KYWxsX2hwY2MkdGFza19pZCA8LSBhcy5udW1lcmljKGFsbF9ocGNjJHRhc2tfaWQpCm1ldHJpY3NfaHBjYyA8LSBtZXRyaWNzW21ldHJpY3MkYXBwID09ICJIUENDIixdCgojIGtlZXBzIHRoZSB1bml0cyBvZiBtZXRyaWNzIGludGFjdAptZXRyaWNzX2hwY2MkbWV0cmljX2FuZF91bml0cyA8LSBwYXN0ZShtZXRyaWNzX2hwY2MkbWV0cmljLCAiKCIsIG1ldHJpY3NfaHBjYyR1bml0cywiKSIsIHNlcD0iIikKcmVtb3ZlKHRlbXApCgojIG1ha2VzIGEgZGF0YSBmcmFtZSB3aXRoIDIxIGNvbHVtbnMsIDI1IHJvd3MgKGhvd2V2ZXIgbWFueSBtZXRyaWNzIHRoZXJlIGFyZSkKdGVtcCA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sPWxlbmd0aCh1bmlxdWUobWV0cmljc19ocGNjJG1ldHJpY19hbmRfdW5pdHMpKSsxLCBucm93PWxlbmd0aCh1bmlxdWUobWV0cmljc19ocGNjJHRhc2tfaWQpKSkpCgojIHNldHMgdXAgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbnMgKGJhc2VkIG9uIHRoZSBtZXRyaWNzIGdvdHRlbikKY29sdW1uX25hbWVzID0gYygidGFza19pZCIsIHVuaXF1ZShtZXRyaWNzX2hwY2MkbWV0cmljX2FuZF91bml0cykpCmNvbG5hbWVzKHRlbXApIDwtIGNvbHVtbl9uYW1lcwojIGF0IHRoaXMgcG9pbnQgdGhlIGNvbHVtbiBuYW1lcyBhcmUgY29ycmVjdAp0ZW1wWyJ0YXNrX2lkIl0gPC0gYXMubnVtZXJpYyh1bmlxdWUobWV0cmljc19ocGNjJHRhc2tfaWQpKQoKIyBkb24ndCBuZWVkIHRvIGRvIHJlc291cmNlIHRoaW5nIGlmIHdlJ3JlIGRvaW5nIHRoZSBtZXJnZSBkb3duIHRoZXJlCiMgcGlja3Mgb3V0IHRoZSB1bmlxdWUgb25lcyBzbyB0aGF0IGl0cyBqdXN0IHRhc2sgaWQgYW5kIHJlc291cmNlIGJlaW5nIGxvb2tlZCBhdAojaWRfYW5kX3Jlc291cmNlIDwtIHVuaXF1ZShtZXRyaWNzX2hwY2MgJT4lIHNlbGVjdCh0YXNrX2lkLCByZXNvdXJjZSkpCgojIGFzc2lnbnMgaW4gdGhlIHJlc291cmNlCiN0ZW1wJHJlc291cmNlIDwtIGlkX2FuZF9yZXNvdXJjZVtpZF9hbmRfcmVzb3VyY2UkdGFza19pZD09dGVtcCR0YXNrX2lkLCAicmVzb3VyY2UiXQoKIyBsb29wIHRocm91Z2ggZWFjaCByb3cgLSBiYXNpY2FsbHkgdGFrZXMgdGhlIHN0YXQgbmFtZXMgYW5kIHB1dHMgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSBwcm9wZXIgY29sdW1uCmZvcihyb3cgaW4gMTpucm93KG1ldHJpY3NfaHBjYykpewogICAgZnVsbF9yb3cgPSBtZXRyaWNzX2hwY2Nbcm93LF0gIyBmdWxsIHJvdyBvZiBkYXRhIGZyYW1lCiAgICBpZCA9IGZ1bGxfcm93JHRhc2tfaWRbMV0jIGdldHMgaWQgb2Ygcm93IAogICAgc3RhdF9uYW1lID0gZnVsbF9yb3ckbWV0cmljX2FuZF91bml0c1sxXSAjIGdldHMgbmFtZSBvZiB0aGUgc3RhdAogICAgc3RhdF92YWwgPSBmdWxsX3JvdyR2YWx1ZVsxXSAjIGdldHMgdmFsdWUgb2YgbWV0cmljCiAgICB0ZW1wW3RlbXAkdGFza19pZD09aWQsc3RhdF9uYW1lXSA8LSBzdGF0X3ZhbCAjIGFzc2lnbnMgdmFsdWUgZm9yIHRoYXQgbWV0cmljIGNvbHVtbgp9CgojIHB1dHMgdGhlbSB0b2dldGhlciBiYXNlZCBvbiBpZAp0ZW1wMiA8LSBtZXJnZSh4PWFsbF9ocGNjLCB5PXRlbXAsIGJ5PSJ0YXNrX2lkIikKZnVsbF9ocGNjIDwtIHRlbXAyCmBgYAoKYGBge3J9CnNldHVwX2RhdGEgPC0gZnVuY3Rpb24oYXBwX3Rlc3QpCnsKICAgIGFsbF9hcHAgPC0gYWxsW2FsbCRhcHAgPT0gYXBwX3Rlc3QsXQogICAgYWxsX2FwcCR0YXNrX2lkIDwtIGFzLm51bWVyaWMoYWxsX2FwcCR0YXNrX2lkKQogICAgbWV0cmljc19hcHAgPC0gbWV0cmljc1ttZXRyaWNzJGFwcCA9PSBhcHBfdGVzdCxdCgogICAgIyBrZWVwcyB0aGUgdW5pdHMgb2YgbWV0cmljcyBpbnRhY3QKICAgIG1ldHJpY3NfYXBwJG1ldHJpY19hbmRfdW5pdHMgPC0gcGFzdGUobWV0cmljc19hcHAkbWV0cmljLCAiKCIsIG1ldHJpY3NfYXBwJHVuaXRzLCIpIiwgc2VwPSIiKQogICAgCgogICAgIyBtYWtlcyBhIGRhdGEgZnJhbWUgd2l0aCAyMSBjb2x1bW5zLCAyNSByb3dzIChob3dldmVyIG1hbnkgbWV0cmljcyB0aGVyZSBhcmUpCiAgICB0ZW1wIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2w9bGVuZ3RoKHVuaXF1ZShtZXRyaWNzX2FwcCRtZXRyaWNfYW5kX3VuaXRzKSkrMSwgbnJvdz1sZW5ndGgodW5pcXVlKG1ldHJpY3NfYXBwJHRhc2tfaWQpKSkpCgogICAgIyBzZXRzIHVwIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW5zIChiYXNlZCBvbiB0aGUgbWV0cmljcyBnb3R0ZW4pCiAgICBjb2x1bW5fbmFtZXMgPSBjKCJ0YXNrX2lkIiwgdW5pcXVlKG1ldHJpY3NfYXBwJG1ldHJpY19hbmRfdW5pdHMpKQogICAgY29sbmFtZXModGVtcCkgPC0gY29sdW1uX25hbWVzCiAgICAjIGF0IHRoaXMgcG9pbnQgdGhlIGNvbHVtbiBuYW1lcyBhcmUgY29ycmVjdAogICAgdGVtcFsidGFza19pZCJdIDwtIGFzLm51bWVyaWModW5pcXVlKG1ldHJpY3NfYXBwJHRhc2tfaWQpKQoKICAgICMgZG9uJ3QgbmVlZCB0byBkbyByZXNvdXJjZSB0aGluZyBpZiB3ZSdyZSBkb2luZyB0aGUgbWVyZ2UgZG93biB0aGVyZQogICAgIyBwaWNrcyBvdXQgdGhlIHVuaXF1ZSBvbmVzIHNvIHRoYXQgaXRzIGp1c3QgdGFzayBpZCBhbmQgcmVzb3VyY2UgYmVpbmcgbG9va2VkIGF0CiAgICAjaWRfYW5kX3Jlc291cmNlIDwtIHVuaXF1ZShtZXRyaWNzX2hwY2MgJT4lIHNlbGVjdCh0YXNrX2lkLCByZXNvdXJjZSkpCgogICAgIyBhc3NpZ25zIGluIHRoZSByZXNvdXJjZQogICAgI3RlbXAkcmVzb3VyY2UgPC0gaWRfYW5kX3Jlc291cmNlW2lkX2FuZF9yZXNvdXJjZSR0YXNrX2lkPT10ZW1wJHRhc2tfaWQsICJyZXNvdXJjZSJdCgogICAgIyBsb29wIHRocm91Z2ggZWFjaCByb3cgLSBiYXNpY2FsbHkgdGFrZXMgdGhlIHN0YXQgbmFtZXMgYW5kIHB1dHMgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSBwcm9wZXIgY29sdW1uCiAgICBmb3Iocm93IGluIDE6bnJvdyhtZXRyaWNzX2FwcCkpewogICAgICAgIGZ1bGxfcm93ID0gbWV0cmljc19hcHBbcm93LF0gIyBmdWxsIHJvdyBvZiBkYXRhIGZyYW1lCiAgICAgICAgaWQgPSBmdWxsX3JvdyR0YXNrX2lkWzFdIyBnZXRzIGlkIG9mIHJvdyAKICAgICAgICBzdGF0X25hbWUgPSBmdWxsX3JvdyRtZXRyaWNfYW5kX3VuaXRzWzFdICMgZ2V0cyBuYW1lIG9mIHRoZSBzdGF0CiAgICAgICAgc3RhdF92YWwgPSBmdWxsX3JvdyR2YWx1ZVsxXSAjIGdldHMgdmFsdWUgb2YgbWV0cmljCiAgICAgICAgdGVtcFt0ZW1wJHRhc2tfaWQ9PWlkLHN0YXRfbmFtZV0gPC0gc3RhdF92YWwgIyBhc3NpZ25zIHZhbHVlIGZvciB0aGF0IG1ldHJpYyBjb2x1bW4KICAgIH0KCiAgICAjIHB1dHMgdGhlbSB0b2dldGhlciBiYXNlZCBvbiBpZAogICAgdGVtcDIgPC0gbWVyZ2UoeD1hbGxfYXBwLCB5PXRlbXAsIGJ5PSJ0YXNrX2lkIikKICAgIHJldHVybih0ZW1wMikKfQoKZnVsbF9uYW1kIDwtIHNldHVwX2RhdGEoIk5BTUQiKQpmdWxsX253Y2hlbSA8LSBzZXR1cF9kYXRhKCJOV0NoZW0iKQpmdWxsX2dhbWVzcyA8LSBzZXR1cF9kYXRhKCJHQU1FU1MiKQpmdWxsX2hwY2cgPC0gc2V0dXBfZGF0YSgiSFBDRyIpIApmdWxsX2hwY2MgPC0gc2V0dXBfZGF0YSgiSFBDQyIpCmZ1bGxfaW9yIDwtIHNldHVwX2RhdGEoIklPUiIpCiMgb2theSBzbyBocGNnIHNlZW1zIHRvIGJlIGEgYml0IG9mZi93ZWlyZCwgbG9va2luZyBpbnRvIGl0CiMgc28gbG9va3MgbGlrZSB3aXRoIHNvbWUgb2YgdGhlIHRoaW5ncyB0aGUgYXZ4IG5lZWRlZCBmb3IgaHBjZyBpc24ndCBhdmFpbGFibGUsIHNvIGl0IGp1c3QgZ2l2ZXMgYW4gZXJyb3IKIyBmb3IgYmFyZSBtZXRhbCwgbG9va3MgbGlrZSBnbG9iYWwgbngsIG55LCBhbmQgbnogYXJlIGFsbCAzMgojIGZvciB0aGUgc2luZ3VsYXJpdHksIGl0IGxvb2tzIGxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGFyZSAyMDggKHNlZSBhcHBzdGRvdXQpCiMgeWVhaCBmb3Igc29tZSByZWFzb24gdGhlIGRhdGEgZmlsZSB3YXMgbm90IGluIHRoZXJlIGZvciB0aGUgYmFyZSBtZXRhbCwgc28gSSBqdXN0IGFkZGVkIGl0IGluCiMgc28gYW55IHRlc3RzIG9uIGJhcmUgbWV0YWwgZm9yIGhwY2cgYWZ0ZXIgMTE6Mzggb24gMDcvMDkvMTkgYXJlIHZhbGlkIGFuZCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHNpbmd1bGFyaXR5IG9uZXMKCiMgZm9yIHNvbWUgcmVhc29uIHRoZSB3YWxsdGltZSBmb3IgbndjaGVtIGlzIGEgbG90IGhpZ2hlciBmb3Igc2luZ3VsYXJpdHkgY29tcGFyZWQgdG8gbm9ybWFsCmBgYAoKYGBge3IsIGZpZy53aWR0aD0xNX0KCmdyaWQuYXJyYW5nZSgKICAgIGdncGxvdChmdWxsX2hwY2MgJT4lIGZpbHRlcihyZXNvdXJjZT09InZvcnRleF9iYXJlX21ldGFsIiksIGFlcyh4ID0gcmVzb3VyY2UsIHkgPSBgQXZlcmFnZSBEb3VibGUtUHJlY2lzaW9uIEdlbmVyYWwgTWF0cml4IE11bHRpcGxpY2F0aW9uIChER0VNTSkgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBmaWxsPWNwdV90eXBlKSkgKwogICAgICAgIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicsIGRvdHNpemU9MC41LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoKSksCiAgICBnZ3Bsb3QoZnVsbF9ocGNjICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJ2b3J0ZXhfZG9ja19zaW5nIiksIGFlcyh4ID0gcmVzb3VyY2UsIHkgPSBgQXZlcmFnZSBEb3VibGUtUHJlY2lzaW9uIEdlbmVyYWwgTWF0cml4IE11bHRpcGxpY2F0aW9uIChER0VNTSkgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBmaWxsPWNwdV90eXBlKSkgKwogICAgICAgIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicsIGRvdHNpemU9MC41LCBwb3NpdGlvbj1wb3NpdGlvbl9qaXR0ZXIoKSksCiAgICBuY29sPTIpCgpgYGAKCmBgYHtyLCBmaWcud2lkdGg9N30KZ2dwbG90KGZ1bGxfaHBjYywgCiAgICAgICBhZXMoeSA9IGBBdmVyYWdlIERvdWJsZS1QcmVjaXNpb24gR2VuZXJhbCBNYXRyaXggTXVsdGlwbGljYXRpb24gKERHRU1NKSBGbG9hdGluZy1Qb2ludCBQZXJmb3JtYW5jZShNRkxPUCBwZXIgU2Vjb25kKWAsIGZpbGw9cmVzb3VyY2UpKSArCiAgICAgICAgZ2VvbV9ib3hwbG90KCkgKyBmYWNldF93cmFwKH4gY3B1X3R5cGUsc2NhbGVzID0gImZyZWUiKQoKZ2dwbG90KGZ1bGxfaHBjYywgCiAgICAgICBhZXMoeSA9IHdhbGx0aW1lLCBmaWxsPXJlc291cmNlKSkgKwogICAgICAgIGdlb21fYm94cGxvdCgpICsgZmFjZXRfd3JhcCh+IGNwdV90eXBlLHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChmdWxsX2hwY2MsIAogICAgICAgYWVzKHkgPSBgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUVykgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBmaWxsPXJlc291cmNlKSkgKwogICAgICAgIGdlb21fYm94cGxvdCgpICsgZmFjZXRfd3JhcCh+IGNwdV90eXBlLHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChmdWxsX2hwY2MsIAogICAgICAgYWVzKHkgPSBgQXZlcmFnZSBTVFJFQU0gJ0NvcHknIE1lbW9yeSBCYW5kd2lkdGgoTUJ5dGUgcGVyIFNlY29uZClgLCBmaWxsPXJlc291cmNlKSkgKwogICAgICAgIGdlb21fYm94cGxvdCgpICsgZmFjZXRfd3JhcCh+IGNwdV90eXBlLHNjYWxlcyA9ICJmcmVlIikKZ2dwbG90KGZ1bGxfaHBjYywgCiAgICAgICBhZXMoeSA9IGBIaWdoIFBlcmZvcm1hbmNlIExJTlBBQ0sgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBmaWxsPXJlc291cmNlKSkgKwogICAgICAgIGdlb21fYm94cGxvdCgpICsgZmFjZXRfd3JhcCh+IGNwdV90eXBlLHNjYWxlcyA9ICJmcmVlIikKCmdncGxvdChmdWxsX2hwY2MgJT4lIGZpbHRlcih3YWxsdGltZT41KSwgCiAgICAgICBhZXMoeSA9IGBBdmVyYWdlIERvdWJsZS1QcmVjaXNpb24gR2VuZXJhbCBNYXRyaXggTXVsdGlwbGljYXRpb24gKERHRU1NKSBGbG9hdGluZy1Qb2ludCBQZXJmb3JtYW5jZShNRkxPUCBwZXIgU2Vjb25kKWAsIGZpbGw9cmVzb3VyY2UpKSArCiAgICAgICAgZ2VvbV9ib3hwbG90KCkgKyBmYWNldF93cmFwKH4gY3B1X3R5cGUsc2NhbGVzID0gImZyZWUiKQoKYGBgCiAgICAgCmBgYHtyfQoKaHBjY19zaW5ndWxhcml0eSA8LSBmdWxsX2hwY2MgJT4lIGZpbHRlcihyZXNvdXJjZT09InNpbmd1bGFyaXR5X3JlYWwiKQpocGNjX2JhcmVfbWV0YWwgPC0gZnVsbF9ocGNjICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJiYXJlX21ldGFsX3JlYWwiKQp0LnRlc3QoaHBjY19zaW5ndWxhcml0eSRgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUVykgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBocGNjX2JhcmVfbWV0YWwkYEZhc3QgRm91cmllciBUcmFuc2Zvcm0gKEZGVFcpIEZsb2F0aW5nLVBvaW50IFBlcmZvcm1hbmNlKE1GTE9QIHBlciBTZWNvbmQpYCkKCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoZnVsbF9ocGNjLCBhZXMoeCA9IHJlc291cmNlLCB5ID0gd2FsbHRpbWUsIGZpbGw9Y3B1X3R5cGUpKSArCiAgICBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXJ3aG9sZScpCmBgYApgYGB7cn0KY29sbmFtZXMoZnVsbF9ocGNjKSA8LSBnc3ViKCIgIiwiXyIsY29sbmFtZXMoZnVsbF9ocGNjKSkKZ2dwbG90KGZ1bGxfaHBjYywgYWVzKHggPSByZXNvdXJjZSwgeSA9IGBNUEkgUmFuZG9tIEFjY2VzcyhNVXBkYXRlIHBlciBTZWNvbmQpYCwgZmlsbD1jcHVfdHlwZSkpICsKICAgIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicsIGJpbndpZHRoPTAuMSkKCmBgYAoKYGBge3J9CmdncGxvdChmdWxsX2hwY2MsIGFlcyh4ID0gcmVzb3VyY2UsIHkgPSBgQXZlcmFnZSBEb3VibGUtUHJlY2lzaW9uIEdlbmVyYWwgTWF0cml4IE11bHRpcGxpY2F0aW9uIChER0VNTSkgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UoTUZMT1AgcGVyIFNlY29uZClgLCBmaWxsPWNwdV90eXBlKSkgKwogICAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoZnVsbF9ocGNjLCBhZXMoeCA9IHJlc291cmNlLCB5ID0gYEF2ZXJhZ2UgU1RSRUFNICdBZGQnIE1lbW9yeSBCYW5kd2lkdGgoTUJ5dGUgcGVyIFNlY29uZClgLCBmaWxsPWNwdV90eXBlKSkgKwogICAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKYGBgCgpgYGB7cn0KZ2dwbG90KGZ1bGxfaHBjYywgYWVzKHggPSByZXNvdXJjZSwgeSA9IGBBdmVyYWdlIFNUUkVBTSAnQ29weScgTWVtb3J5IEJhbmR3aWR0aChNQnl0ZSBwZXIgU2Vjb25kKWAsIGZpbGw9Y3B1X3R5cGUpKSArCiAgICBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZnVsbF9ocGNjLCBhZXMoeCA9IHJlc291cmNlLCB5ID0gYEZhc3QgRm91cmllciBUcmFuc2Zvcm0gKEZGVFcpIEZsb2F0aW5nLVBvaW50IFBlcmZvcm1hbmNlKE1GTE9QIHBlciBTZWNvbmQpYCwgZmlsbD1jcHVfdHlwZSkpICsKICAgIGdlb21fZG90cGxvdChiaW5heGlzPSd5Jywgc3RhY2tkaXI9J2NlbnRlcicpCgpgYGAKYGBge3J9CmdncGxvdChmdWxsX2hwY2MsIGFlcyh4ID0gcmVzb3VyY2UsIHkgPSBgSGlnaCBQZXJmb3JtYW5jZSBMSU5QQUNLIEVmZmljaWVuY3koUGVyY2VudClgLCBmaWxsPWNwdV90eXBlKSkgKwogICAgZ2VvbV9kb3RwbG90KGJpbmF4aXM9J3knLCBzdGFja2Rpcj0nY2VudGVyJykKCmBgYAoKYGBge3J9CmdncGxvdChmdWxsX2hwY2MsIGFlcyh4ID0gcmVzb3VyY2UsIHkgPSBgUGFyYWxsZWwgTWF0cml4IFRyYW5zcG9zZSAoUFRSQU5TKShNQnl0ZSBwZXIgU2Vjb25kKWAsIGZpbGw9Y3B1X3R5cGUpKSArCiAgICBnZW9tX2RvdHBsb3QoYmluYXhpcz0neScsIHN0YWNrZGlyPSdjZW50ZXInKQpgYGAKCgpgYGB7cn0KIyBtYWtpbmcgc3VyZSB0byBmaWx0ZXIgb3V0IGFueSByZXNvdXJjZXMgd2UgYWludCB1c2luZwptZXRyaWNzICU8PiUgZmlsdGVyKHJlc291cmNlICVpbiUgYygidm9ydGV4X2JhcmVfbWV0YWwiLCJ2b3J0ZXhfZG9ja19zaW5nIikpCgptZXRyaWNzJHJlc291cmNlIDwtIGZhY3RvcigKICAgIG1ldHJpY3MkcmVzb3VyY2UsCiAgICBsZXZlbHMgPSB1bmlxdWUoYygidm9ydGV4X2JhcmVfbWV0YWwiLCJ2b3J0ZXhfZG9ja19zaW5nIikpKQoKbGV2ZWxzKG1ldHJpY3MkcmVzb3VyY2UpIDwtIGMoIlRlc3RDbHVzdGVyIiwiUHJvZHVjdGlvbkNsdXN0ZXIiKQptZXRyaWNzJG5ub2RlcyA8LSBmYWN0b3IobWV0cmljcyRubm9kZXMsbGV2ZWxzID0gdW5pcXVlKGMoMSwyLDQsOCwxNixtZXRyaWNzJG5ub2RlcykpKQoKbWV0cmljcyRzdGF0ZV9pZCA8LSBtZXRyaWNzJHN0YXRlCm1ldHJpY3Mkc3RhdGUgPC0gYXMuY2hhcmFjdGVyKG1ldHJpY3Mkc3RhdGVfaWQpCm1ldHJpY3Mkc3RhdGVbbWV0cmljcyRzdGF0ZT09IjEiXTwtIkJlZm9yZSIKbWV0cmljcyRzdGF0ZVttZXRyaWNzJHN0YXRlPT0iMiJdPC0iQWZ0ZXIiCgptZXRyaWNzJHN0YXRlIDwtIGZhY3RvcihtZXRyaWNzJHN0YXRlLGxldmVscyA9IGMoIkJlZm9yZSIsIkFmdGVyIikpCgptZXRyaWNzICU8PiUgYXJyYW5nZShjb2xsZWN0ZWQpCgojY29udmVydCBtZCBwZXJmb3JtYW5jZSBzaG91bGQgYmUgbnMvZGF5IHdhcyBzaW0gc2Vjb25kIHBlciBEYXkKaiA8LSBtZXRyaWNzJG1ldHJpYz09Ik1vbGVjdWxhciBEeW5hbWljcyBQZXJmb3JtYW5jZSIKbWV0cmljcyR2YWx1ZVtqXSA8LSBtZXRyaWNzJHZhbHVlW2pdKjFlOQptZXRyaWNzJHVuaXRzW2pdIDwtICJucy9kYXkiCgoKYGBgCgoKYGBge3J9CndyaXRlLmNzdihtZXRyaWNzLCJtZXRyaWNzLmNzdiIpCnNhdmUoCiAgICBsaXN0PWMoIm1ldHJpY3MiKSwKICAgIGZpbGU9Im1ldHJpY3MuUmRhdGEiCikKYGBgCgoKCmBgYHtyfQoKCm1ldHJpY3MgJTw+JSBmaWx0ZXIoYXBwICVpbiUgYygiSFBDQyIsIk5BTUQiKSkKbWV0cmljcyRhcHAgPC0gZmFjdG9yKGFzLmNoYXJhY3RlcihtZXRyaWNzJGFwcCksbGV2ZWxzID0gYygiSFBDQyIsIk5BTUQiKSkKCnNlbGVjdGVkX21ldHJpY3MgPC0gYygKICAgICJXYWxsIENsb2NrIFRpbWUiLAogICAgIk1vbGVjdWxhciBEeW5hbWljcyBTaW11bGF0aW9uIFBlcmZvcm1hbmNlIiwKICAgICJIaWdoIFBlcmZvcm1hbmNlIExJTlBBQ0sgRmxvYXRpbmctUG9pbnQgUGVyZm9ybWFuY2UiLAogICAgIkZhc3QgRm91cmllciBUcmFuc2Zvcm0gKEZGVFcpIEZsb2F0aW5nLVBvaW50IFBlcmZvcm1hbmNlIiwKICAgICJBdmVyYWdlIERvdWJsZS1QcmVjaXNpb24gR2VuZXJhbCBNYXRyaXggTXVsdGlwbGljYXRpb24gKERHRU1NKSBGbG9hdGluZy1Qb2ludCBQZXJmb3JtYW5jZSIsCiAgICAiQXZlcmFnZSBTVFJFQU0gJ0NvcHknIE1lbW9yeSBCYW5kd2lkdGgiCikKbWV0cmljcyAlPD4lIGZpbHRlcihtZXRyaWMgJWluJSBzZWxlY3RlZF9tZXRyaWNzKQptZXRyaWNzJG1ldHJpYyA8LSBmYWN0b3IoYXMuY2hhcmFjdGVyKG1ldHJpY3MkbWV0cmljKSxsZXZlbHMgPSBzZWxlY3RlZF9tZXRyaWNzKQptZXRyaWNzJG1ldHJpY19sb25nIDwtIG1ldHJpY3MkbWV0cmljCmxldmVscyhtZXRyaWNzJG1ldHJpYykgPC0gYygKICAgICJXYWxsIFRpbWUiLAogICAgIk1EIFBlcmYuIiwKICAgICJMSU5QQUNLIiwKICAgICJGRlQiLAogICAgIkRHRU1NIiwKICAgICJTVFJFQU0iCikKCiNjb252ZXJ0IG1kIHBlcmZvcm1hbmNlIHNob3VsZCBiZSBucy9kYXkgd2FzIHNpbSBzZWNvbmQgcGVyIERheQpqIDwtIG1ldHJpY3MkbWV0cmljPT0iTW9sZWN1bGFyIER5bmFtaWNzIFBlcmZvcm1hbmNlIgptZXRyaWNzJHZhbHVlW2pdIDwtIG1ldHJpY3MkdmFsdWVbal0qMWU5CgpqIDwtIG1ldHJpY3MkbWV0cmljPT0iTElOUEFDSyIKbWV0cmljcyR2YWx1ZVtqXSA8LSBtZXRyaWNzJHZhbHVlW2pdLzEwMjQKCiNtZXRyaWNzICU+JSBncm91cF9ieShtZXRyaWMpICU+JSBzdW1tYXJpc2UodW5pdHM9bGFzdCh1bml0cykpCm1ldHJpY3MkdW5pdHMgPC0gbWV0cmljcyRtZXRyaWMKbGV2ZWxzKG1ldHJpY3MkdW5pdHMpIDwtIGMoCiAgICAicyIsCiAgICAibnMvZGF5IiwKICAgICJHRkxPUC9zIiwKICAgICJNRkxPUC9zIiwKICAgICJNRkxPUC9zIiwKICAgICJNQi9zIgopCgpzYXZlKAogICAgbGlzdD1jKCJtZXRyaWNzIiksCiAgICBmaWxlPSJtZXRyaWNzX3NlbGVjdGVkLlJkYXRhIgopCmBgYAoKYGBge3J9CmxvYWQoZmlsZT0ibWV0cmljc19zZWxlY3RlZC5SZGF0YSIpCiNzZWxlY3Qgb25seSB3aGF0IGlzIG5lZWRlZDIKCiNvbmx5IHVwIHRvIDMwIHBvaW50cyBmb3IgVGVzdGluZy1DbHVzdGVyCm1ldHJpY3MgJT4lIGdyb3VwX2J5KHJlc291cmNlLCBhcHAsIG5ub2RlcywgbWV0cmljLCBzdGF0ZSkgJT4lIAogICAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUgCiAgICBzdW1tYXJpc2Uobj1uKCksYXZnPW1lYW4odmFsdWUpLHVuaXRzPWxhc3QodW5pdHMpKQogICAgCm1ldHJpY3MgJTw+JSBncm91cF9ieShyZXNvdXJjZSwgYXBwLCBubm9kZXMsIG1ldHJpYywgc3RhdGUpICU+JSAKICAgICAgICBtdXRhdGUoaWQgPSByb3dfbnVtYmVyKCkpICU+JSB1bmdyb3VwKCkKCgptZXRyaWNzICU8PiUgZmlsdGVyKCEocmVzb3VyY2U9PSJUZXN0aW5nLUNsdXN0ZXIiICYgaWQgPiAzMEwpKQoKI1NwYXJjaWZ5IEFmdGVyIGZvciBVQkhQQwptZXRyaWNzICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJVQi1IUEMiICYgYXBwID09ICJOQU1EIikgJT4lIGdyb3VwX2J5KHJlc291cmNlLCBhcHAsIG5ub2RlcywgbWV0cmljLCBzdGF0ZSkgJT4lIAogICAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUgCiAgICBzdW1tYXJpc2Uobj1uKCksYXZnPW1lYW4odmFsdWUpLHVuaXRzPWxhc3QodW5pdHMpKQoKbWV0cmljc191YmhwYyA8LSBtZXRyaWNzICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJVQi1IUEMiICYgc3RhdGU9PSJBZnRlciIgJiBtZXRyaWMgPT0gIldhbGwgVGltZSIgJiBhcHAgPT0gIk5BTUQiICYgbm5vZGVzID09IDFMICYgaWQgPiAxMCkKc2V0LnNlZWQoMDgxMjIwMTgpCnJlbW92ZXJfdGFza19pZCA8LSBtZXRyaWNzX3ViaHBjJHRhc2tfaWRbIShtZXRyaWNzX3ViaHBjJHRhc2tfaWQgJWluJSBzYW1wbGUobWV0cmljc191YmhwYyR0YXNrX2lkLHNpemUgPSAyMEwpKV0KbWV0cmljcyAlPD4lIGZpbHRlcighKHRhc2tfaWQgJWluJSByZW1vdmVyX3Rhc2tfaWQpKQoKbWV0cmljc191YmhwYyA8LSBtZXRyaWNzICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJVQi1IUEMiICYgc3RhdGU9PSJBZnRlciIgJiBtZXRyaWMgPT0gIldhbGwgVGltZSIgJiBhcHAgPT0gIk5BTUQiICYgbm5vZGVzID09IDJMICYgaWQgPiAyMCkKcmVtb3Zlcl90YXNrX2lkIDwtIG1ldHJpY3NfdWJocGMkdGFza19pZFshKG1ldHJpY3NfdWJocGMkdGFza19pZCAlaW4lIHNhbXBsZShtZXRyaWNzX3ViaHBjJHRhc2tfaWQsc2l6ZSA9IDEwTCkpXQptZXRyaWNzICU8PiUgZmlsdGVyKCEodGFza19pZCAlaW4lIHJlbW92ZXJfdGFza19pZCkpCgoKbWV0cmljc191YmhwYyA8LSBtZXRyaWNzICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJVQi1IUEMiICYgc3RhdGU9PSJBZnRlciIgJiBtZXRyaWMgPT0gIldhbGwgVGltZSIgJiBhcHAgPT0gIkhQQ0MiICYgbm5vZGVzID09IDFMICYgaWQgPiAxMCkKc2V0LnNlZWQoMDgxMjIwMTgpCnJlbW92ZXJfdGFza19pZCA8LSBtZXRyaWNzX3ViaHBjJHRhc2tfaWRbIShtZXRyaWNzX3ViaHBjJHRhc2tfaWQgJWluJSBzYW1wbGUobWV0cmljc191YmhwYyR0YXNrX2lkLHNpemUgPSAyMEwpKV0KbWV0cmljcyAlPD4lIGZpbHRlcighKHRhc2tfaWQgJWluJSByZW1vdmVyX3Rhc2tfaWQpKQoKbWV0cmljc191YmhwYyA8LSBtZXRyaWNzICU+JSBmaWx0ZXIocmVzb3VyY2U9PSJVQi1IUEMiICYgc3RhdGU9PSJBZnRlciIgJiBtZXRyaWMgPT0gIldhbGwgVGltZSIgJiBhcHAgPT0gIkhQQ0MiICYgbm5vZGVzID09IDJMICYgaWQgPiAxMCkKcmVtb3Zlcl90YXNrX2lkIDwtIG1ldHJpY3NfdWJocGMkdGFza19pZFshKG1ldHJpY3NfdWJocGMkdGFza19pZCAlaW4lIHNhbXBsZShtZXRyaWNzX3ViaHBjJHRhc2tfaWQsc2l6ZSA9IDIwTCkpXQptZXRyaWNzICU8PiUgZmlsdGVyKCEodGFza19pZCAlaW4lIHJlbW92ZXJfdGFza19pZCkpCgoKbWV0cmljcyAlPiUgZmlsdGVyKHJlc291cmNlPT0iVUItSFBDIikgJT4lIGdyb3VwX2J5KHJlc291cmNlLCBhcHAsIG5ub2RlcywgbWV0cmljLCBzdGF0ZSkgJT4lIAogICAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUgCiAgICBzdW1tYXJpc2Uobj1uKCksYXZnPW1lYW4odmFsdWUpLHVuaXRzPWxhc3QodW5pdHMpKQoKc2F2ZSgKICAgIGxpc3Q9YygibWV0cmljcyIpLAogICAgZmlsZT0ibWV0cmljc19zZWxlY3RlZDIuUmRhdGEiCikKYGBgCgpgYGB7cn0KI1JlYWQgbWV0cmljcyBiaWdnZXIgc21hbGxlcgoKYWtfbWV0cmljcyA8LSByZWFkLmNzdigiYWtfbWV0cmljcy5jc3YiLGhlYWRlciA9IEYsY29sLm5hbWVzID0gYygiYXBwIiwibWV0cmljIiwiYmV0dGVyIikpCgptX2FwcDwtYWtfbWV0cmljcyRhcHBbWzFdXQpmb3IoaSBpbiAyOm5yb3coYWtfbWV0cmljcykpewogICAgaWYoYWtfbWV0cmljcyRhcHBbW2ldXT09IiIpewogICAgICAgIGFrX21ldHJpY3MkYXBwW1tpXV09bV9hcHAKICAgIH1lbHNlewogICAgICAgIG1fYXBwPC1ha19tZXRyaWNzJGFwcFtbaV1dCiAgICB9Cn0KYWtfbWV0cmljcyRCaWdnZXJCZXR0ZXIgPC0gYWtfbWV0cmljcyRiZXR0ZXIgIT0iUyIKCmFrX21ldHJpY3MgJTw+JSBmaWx0ZXIobWV0cmljIT0iIiAmIGFwcCAlaW4lIHVubGlzdChhcHBfY29udix1c2UubmFtZXMgPSBGKSkgICU+JSBzZWxlY3QoLWJldHRlcikKCnNhdmUoCiAgICBsaXN0PWMoImFrX21ldHJpY3MiKSwKICAgIGZpbGU9ImFrX21ldHJpY3MuUmRhdGEiCikKYGBgCgoKCgoKCgoK